package com.xmfh.wemedia.controller;


import com.xmfh.wemedia.dto.VideoDTO;
import com.xmfh.wemedia.exception.FileCopyException;
import com.xmfh.wemedia.exception.FileNoNameException;
import com.xmfh.wemedia.model.DdVideo;
import com.xmfh.wemedia.service.impl.DdVideoServiceImpl;
import com.xmfh.wemedia.util.FileDirectory;
import com.xmfh.wemedia.util.JsonResult;
import com.xmfh.wemedia.vo.VideoVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author admin
 * @since 2022-04-06
 */
@RestController
@RequestMapping("/wemedia/ddVideo")
public class DdVideoController {

    /**
     * 获取视频文件目录以及封面文件目录
     */
    @Autowired
    private FileDirectory directory;

    @Autowired
    private DdVideoServiceImpl service;

    /**
     * 获取全站视频排行
     *
     * @return 全站前10热度的视频
     */
    @GetMapping("/general/getHotVideo")
    public JsonResult<List<DdVideo>> getHotVideo() {
        return service.getHotVideo();
    }

    /**
     * 获取个人主页中视频分页信息
     *
     * @param session 网页缓存，包含目前登陆用户的信息
     * @return 个人视频集合
     */
    @GetMapping("/home_page/getPersonalVideo")
    public JsonResult<List<DdVideo>> getPersonalVideo(HttpSession session) {
        Integer id = DdUserController.getCurrentUser(session).getId();
        return JsonResult.ok(service.getPersonalVideo(id));
    }

    /**
     * 处理用户临时上传的视频文件
     *
     * @param file 用户上传的文件
     * @return 用户提示消息
     */
    @PostMapping("/uploadVideoFile")
    public Object uploadVideFile(MultipartFile file) {
        String originalName;
        try {
            originalName = service.uploadFile(directory.getLocalVideoStorage(), directory.getLocalTargetVideoStorage(), file);
        } catch (FileCopyException | FileNoNameException e) {
            return JsonResult.fail(JsonResult.State.FILE_ERROR, e.getMessage());
        }
        return JsonResult.ok(originalName);
    }

    /**
     * 用户更改上传文件时对已存在的本地文件进行删除
     *
     * @param name 本地文件名称
     * @return 用户提示消息
     */
    @GetMapping("/deleteUploadedVideoFile")
    public JsonResult<Void> deleteUploadedVideoFile(String name) {
        service.deleteUploadedFile(directory.getLocalVideoStorage(), directory.getLocalTargetVideoStorage(), name);
        return JsonResult.ok();
    }

    /**
     * 处理用户临时上传的封面文件
     *
     * @param file 用户上传的文件
     * @return 用户提示消息
     */
    @PostMapping("/uploadCoverFile")
    public Object uploadCoverFile(MultipartFile file) {
        String originalName;
        try {
            originalName = service.uploadFile(directory.getLocalCoverStorage(), directory.getLocalTargetCoverStorage(), file);
        } catch (FileCopyException | FileNoNameException e) {
            return JsonResult.fail(JsonResult.State.FILE_ERROR, e.getMessage());
        }
        return JsonResult.ok(originalName);
    }

    /**
     * 用户更改上传文件时对已存在的本地文件进行删除
     *
     * @param name 本地文件名称
     * @return 用户提示消息
     */
    @GetMapping("/deleteUploadedCoverFile")
    public JsonResult<Void> deleteUploadedCoverFile(String name) {
        service.deleteUploadedFile(directory.getLocalCoverStorage(), directory.getLocalTargetCoverStorage(), name);
        return JsonResult.ok();
    }

    /**
     * 处理最终处理用户上传的请求
     *
     * @param video 用户视频的包装类
     * @return 用户提示消息
     */
    @PostMapping("/uploadVideoInfo")
    public Object uploadVideoInfo(@RequestBody VideoVo video) {
        VideoDTO videoDTO;
        try {
            videoDTO = service.uploadVideoInfo(video);
        } catch (RuntimeException e) {
            e.printStackTrace();
            return JsonResult.fail(JsonResult.State.ERROR_UNKNOWN, e.getMessage());
        }
        return JsonResult.ok(videoDTO);
    }
}
